
import type {
  IModuleTree,
  IModule,
  IModuleState
} from '../types/10-module'

/**
 * 后端的结构转换为树状结构
 * @param state 状态，moduleTree：树状的部门信息；moduleList：后端列表；moduleObject：key-value的
 */
export function listToTree(state: IModuleState) {
  //从状态中获取部门信息
  const { moduleTree, moduleList, moduleObject } = state

  const tmp = {} // 中转容器
  // 第一次遍历，转换为 key 的形式
  moduleList.forEach((module: IModule) => {
    moduleObject[module.id] = module // 存入 key-value，非必要
    tmp[module.id] = {
      id: module.id,
      label: module.deptName,
      children: []
    }
  })

  // 第二次遍历，寻找父节点
  moduleList.forEach((module: IModule) => {
    // 判断父级
    if (tmp[module.parentId]) {
      // 有父级，加入 children
      tmp[module.parentId].children.push(tmp[module.id])
    } else {
      // 顶级，加入 moduleTree
      moduleTree.push(tmp[module.id])
    }
  })
}


/**
 * tree 转换为转换为后端的形式
 * @param state 状态，moduleList：后端列表，目标。moduleObject：key-value;currentModule.sortAll 全排列
 * @param parentId 父级ID，第一次传 0
 * @param level 层数，第一次传 0
 * @param path 路径，第一次传 ''
 * @param treeNode 节点
 * @param parentSort 同级里的序号，第一次传 1
 */
export function treeToList(
  state: IModuleState, // 
  parentId: number | string,
  level: number,
  path: string,
  treeNode: IModuleTree,
  parentSort: number
) {

  // 把 node 存入 list
  // 判断有无children 
  // 没有，结束递归
  // 有，递归

  // 设置 moduleObject
  const module = state.moduleObject[treeNode.id]
  module.level = level
  module.parentId = parentId
  module.path = path + parentId + ','
  module.sort = parentSort * 10
  module.sortAll = (state.currentModule.sortAll++ ) * 10

  // 把 部门信息 存入 list
  state.moduleList.push({
    id: treeNode.id,
    deptName: treeNode.label, // 部门名称
    level: level, // 层级
    parentId: parentId, // 上级部门ID
    path: module.path, // 父ID集合，“,”号分割
    sort: module.sort, // 同一个父级里的先后顺序
    sortAll: module.sortAll // 部门全排列
  })

  // 判断有无children 
  if (treeNode.children && treeNode.children.length > 0) {
    // 有，递归
    treeNode.children.forEach((node: IModuleTree, index: number) => {
      treeToList(state, treeNode.id, level + 1, module.path, node, index + 1)
    })
  } else {
    // 没有，退出递归
  }
}